package com.ylr.admin.framework.controller.web;

import java.util.List;
import java.util.Objects;

import com.ylr.base.common.annotation.Resubmit;
import com.ylr.base.common.dto.GroupDto;
import com.ylr.base.common.dto.PageDto;
import com.ylr.admin.common.dto.role.RoleDto;
import com.ylr.admin.common.dto.role.RoleEnumDto;
import com.ylr.admin.common.dto.role.SimpleRoleDto;
import com.ylr.base.common.enums.CommonEnum;
import com.ylr.admin.common.enums.RoleEnum;
import com.ylr.base.common.jsr303.group.OrderSearch;
import com.ylr.base.common.jsr303.group.Save;
import com.ylr.base.common.jsr303.group.Update;
import com.ylr.base.common.vo.UpdateStatusVo;
import com.ylr.admin.common.vo.role.RoleFormVo;
import com.ylr.admin.common.vo.role.RoleVo;
import com.ylr.admin.framework.service.RoleService;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import com.ylr.base.common.tool.Result;

import javax.validation.constraints.Size;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wyw
 * date: 2023-04-21 11:45:26
 * className: RoleController
 * version: 1.0
 * description:
 */
@Validated
@RestController
@RequestMapping("/wen/role")
@AllArgsConstructor
public class RoleWebController {

    private static final Logger log = LoggerFactory.getLogger(RoleWebController.class);

    private final RoleService roleService;

    /**
     * 保存角色接口
     * <p>
     * 此接口会校验是否重复提交
     * @param roleVo 参数对象
     */
    @Resubmit(message = "保存角色")
    @PostMapping("/save")
    public Result<Object> saveRole(@Validated(Save.class) @RequestBody RoleVo roleVo) {
        log.info("web => 开始保存角色操作。{}", roleVo);
        if (RoleEnum.isTypeFail(roleVo.getType())) {
            log.info("角色类型枚举值不存在");
            return Result.requestFail("角色类型值错误");
        }

        roleService.saveRole(roleVo);

        log.info("web => 保存角色操作结束");
        return Result.success();
    }

    /**
     * 分页查询角色列表接口
     * @param roleFormVo 参数对象
     * @return 角色分页数据
     */
    @PostMapping("/page/list")
    public Result<PageDto<RoleDto>> pageRoleList(@Validated(OrderSearch.class) @RequestBody RoleFormVo roleFormVo) {
        log.info("web => 开始分页查询角色列表操作。{}", roleFormVo);

        PageDto<RoleDto> pageDto = roleService.pageRoleList(roleFormVo);

        log.info("web => 分页查询角色列表操作操作");
        return Result.success(pageDto);
    }

    /**
     * 获取角色列表接口
     * 返回分组后的角色列表数据
     * @return 角色列表
     */
    @GetMapping("/list")
    public Result<List<GroupDto<SimpleRoleDto>>> getList() {
        log.info("开始获取角色列表操作");

        List<GroupDto<SimpleRoleDto>> roleList = roleService.getList();

        log.info("获取角色列表操作结束");
        return Result.success(roleList);
    }

    /**
     * 获取角色数据接口
     * @param id 主键
     * @return 角色数据
     */
    @GetMapping("/get")
    public Result<RoleDto> getRole(@RequestParam("id") Long id){
        log.info("web => 开始获取角色数据操作。id={}", id);

        RoleDto roleDto = roleService.getRole(id);

        log.info("web => 获取角色数据操作结束");
        return Result.success(roleDto);
    }

    /**
     * 获取角色下一个排序等级接口
     * @return 排序等级数值
     */
    @GetMapping("/next/sort")
    public Result<Integer> getNextSort() {
        log.info("web => 开始获取角色下一个排序等级操作");

        Integer sort = roleService.getNextSort();

        log.info("web => 获取角色下一个排序等级操作结束");
        return Result.success(sort);
    }

    /**
     * 获取角色页面枚举数据接口
     * @return 页面枚举数据
     */
    @GetMapping("/page/enums")
    public Result<RoleEnumDto> getPageEnums() {
        log.info("web => 开始获取角色页面枚举数据操作");

        RoleEnumDto roleEnumDto = roleService.getPageEnums();

        log.info("web => 获取页面枚举数据操作结束");
        return Result.success(roleEnumDto);
    }

    /**
     * 修改角色接口
     * <p>
     * 此接口会校验是否重复提交
     * @param roleVo 参数对象
     */
    @Resubmit(message = "修改角色")
    @PostMapping("/update")
    public Result<Object> updateRole(@Validated(Update.class) @RequestBody RoleVo roleVo){
        log.info("web => 开始修改角色操作。{}", roleVo);
        if (RoleEnum.isTypeFail(roleVo.getType())) {
            log.info("角色类型枚举值不存在");
            return Result.requestFail("角色类型值错误");
        }
        roleService.updateRole(roleVo);

        log.info("web => 修改角色操作结束");
        return Result.success();
    }

    /**
     * 修改角色状态接口
     * <p>
     * 此接口会校验是否重复提交
     * @param updateStatusVo 参数对象
     */
    @Resubmit(message = "修改角色状态")
    @PostMapping("/update/status")
    public Result<Object> updateRoleStatus(@Validated @RequestBody UpdateStatusVo updateStatusVo) {
        log.info("web => 开始修改角色状态操作。{}", updateStatusVo);

        CommonEnum statusEnum = CommonEnum.getStatusEnum(updateStatusVo.getStatus());
        if (Objects.isNull(statusEnum)) {
            log.info("角色状态值错误");
            return Result.requestFail("角色状态值错误");
        }

        roleService.updateRoleStatus(updateStatusVo);

        log.info("web => 修改角色状态操作结束");
        return Result.success();
    }

    /**
     * 删除角色接口
     * <p>
     * 此接口会校验是否重复提交
     * @param idList 主键列表
     */
    @Resubmit(message = "删除角色")
    @DeleteMapping("/delete")
    public Result<Object> deleteRole(@Size(min = 1, message = "主键列表不能为空") @RequestBody List<Long> idList){
        log.info("web => 开始删除角色操作。idList={}", idList);

        roleService.deleteRole(idList);

        log.info("web => 删除角色操作结束");
        return Result.success();
    }

}
